================================================================
 例程 4：IO 模拟 I2C 读取 14bit 绝对角度 —— Keil 工程（STM32F103C8/CBT6）
================================================================
与例程 3（硬件 I2C1）功能相同，本例程用 GPIO 软件模拟 I2C
时序，不占用硬件 I2C 外设；SDA/SCL 可用任意 GPIO（改宏即可），
默认引脚与硬件版一致（PB6/PB7），便于两种实现对比。

一、使用步骤
  1) 双击打开  MDK-ARM\04_IIC_GPIO.uvprojx
  2) 直接编译（0 错误），SWD 烧录
     环境：Keil MDK5 + ARMCC V5.06(AC5) + Keil.STM32F1xx_DFP
     器件选 STM32F103C8，与 CBT6 完全兼容，直接烧录运行

二、接线（编码器 MODE 脚悬空或接高电平；Z/CS 脚保持高电平）
  编码器 SCL (B 脚) -> PB6  (软件 SCL，可改 main_iic_gpio.c 宏)
  编码器 SDA (A 脚) -> PB7  (软件 SDA，可改 main_iic_gpio.c 宏)
  SDA/SCL 必须有 4.7kΩ 上拉（编码器板自带则免）
  编码器 VCC -> 5V / 3.3V
  编码器 GND -> GND（与 MCU 共地）
  PA9(USART1_TX) -> USB转TTL RX（调试打印）

三、调试输出
  USART1 PA9，115200-8-N-1，每 200ms 一帧：
  angle=16383  deg=359.98  err=0

四、实现要点
  - 时钟：复位后默认内部 HSI 8MHz，无需外部晶振
  - I2C 从机地址固定 0x06（7bit），字节地址：写 0x0C / 读 0x0D
  - 角度 = (b0<<8 | b1) >> 2，0~16383 对应 0~360°
  - GPIO 配置为开漏输出：输出 0 强拉低、输出 1 释放总线（上拉
    拉高）；STM32 输出模式下读 IDR 即引脚实际电平，无需切换
    输入方向
  - 时序为标准模式 100kHz（软件延时半位周期），时序宽松稳定
  - 换引脚：只改 main_iic_gpio.c 顶部 SOFT_SCL_BIT /
    SOFT_SDA_BIT 两个宏与 i2c_init() 中的 GPIO 配置

五、排障
  - err 持续增长（NACK）：优先查 SDA/SCL 上拉电阻、编码器
    MODE 脚电平（需高/悬空）、Z/CS 脚是否拉高、双方是否共地
  - 详细协议说明见《STM32F103读编码器例程》03 例程 README.md
